home *** CD-ROM | disk | FTP | other *** search
- ; .VERBOSE
-
- INCLUDE HGMacs.Txt
- INCLUDE PackMacs.Txt
- INCLUDE Traps.D
- INCLUDE SysEquX.D
- INCLUDE FSEqu.D
- ; INCLUDE ToolEqu.D
- AppParmHandle EQU $AEC ;not in the MDS 2.0 equates
- .TRAP _DebugStr $ABFF
- .TRAP _SCSIDispatch $A815
- scsiStat EQU 10
- .MACRO _SCSIStat
- MOVE.W #scsiStat,-(A7)
- _SCSIDispatch
- .ENDM
-
- sndRefNum EQU -4
- hloc EQU 100
- vloc EQU 100
- buffsize EQU 512*22
- N EQU 2 ;number of buffers
- vblSize EQU vblPhase+2
- ffMode EQU 0
-
- RECORD 0,INCREMENT
- extlen$ VAR 4
- MACRO extlen =| ;use (An) addressing
- extptr VAR 4
- rate VAR 4
- datahndl VAR 4 ;used by init only
- codehndl VAR 4 ;used by init only
- taskcount VAR 2
- ALGN 0,4 ;for '020 efficiency
- hdrsize ENDR
-
- RECORD 0,INCREMENT
- FILL ioQElSize
- vblQEl1 VAR vblSize
- sndPB VAR ioQElSize
- vblQEl2 VAR vblSize
- FILL 4 ;for rate -- mode overlaps vblPhase
- readbuff VAR buffsize
- overrun VAR 368
- ALGN 0,4 ;for '020 efficiency
- blksize ENDR
-
- ratevalue EQU $00010000
- zR EQU D7
-
- LINK A6,#-(rName+64)
- MOVEQ #0,zR
- PEA -4(A5)
- _InitGraf
- _InitFonts
- _InitWindows
- _InitMenus
- MOVE.L AppParmHandle,A0
- _HLock
- MOVE.L (A0),A4
-
- MOVE.L #ratevalue,D6
- MOVE.W (A4)+,D0 ;message: 0 = Open, 1 = Print
- LSR.L D0,D6
- MOVE.W (A4)+,D4 ;count of files
- BEQ.S useSF
- SUBQ.W #1,D4
- @dofile
- MOVE.W (A4)+,D3 ;volume ref num
- ADDQ #6,A4 ;skip over file type & version number
- BSR.S dofile
- MOVEQ #1,D0
- OR.B (A4)+,D0 ;length byte
- ADDA.L D0,A4 ;skip over file name
- DBRA D4,@dofile
- UNLK A6
- RTS
- useSF
- MOVE.L A7,A4
- MOVE.L #vloc<<16+hloc,-(SP) ;where
- SUBQ #4,SP ;prompt--not used
- MOVE.L zR,-(SP) ;fileFilter
- MOVE.W #1,-(SP) ;numTypes
- PEA typeList ;typeList
- MOVE.L zR,-(SP) ;dlgHook
- MOVE.L A4,-(SP) ;reply
- _SFGetFile
- TST.B (A4) ;rGood
- BEQ.S @cancel
- MOVE.W rVolume(A4),D3
- LEA rName(A4),A4
- BSR.S dofile
- BRA.S useSF
- @cancel
- UNLK A6
- RTS
- typeList DC.W 'FSSD'
-
- openerr:
- MOVE.W D0,D1
- MOVE.L A3,A0
- _DisposPtr
- MOVE.W D1,D0
- nomem:
- NEG.W D0
- MOVE.W D0,-(A7)
- _SysBeep
- UNLK A6
- RTS
- dofile
- LINK A6,#-evtBlkSize
- MOVE.L #hdrsize+N*blkSize,D0
- _NewPtr
- BNE nomem
- MOVEA.L A0,A3
- LEA hdrsize(A3),A0
- MOVE.L A3,A2
- MOVEQ #(hdrsize+readbuff)/4-1,D1
- @clr MOVE.L zR,(A2)+ ;faster than CLR.L
- DBRA D1,@clr ;A2 points to readbuff
-
- MOVE.W #N,taskcount(A3)
- MOVE.L D6,rate(A3)
-
- MOVE.B #fsRdPerm,ioPermssn(A0)
- MOVE.W D3,ioVRefNum(A0)
- MOVE.L A4,ioFileName(A0)
- _Open
- BNE.S openerr
- MOVE.L A3,ioOwnBuf(A0)
- MEA1 readcomp,ioCompletion(A0)
- MOVE.L A2,ioBuffer(A0) ;points to readbuff
- MOVE.L #buffsize,ioReqCount(A0)
- ; CLR.W ioPosMode(A0) ;= fsAtMark
- MOVE.W #sndRefNum,sndPB+ioRefNum(A0)
- MEA1 sndcomp,sndPB+ioCompletion(A0)
- ADDQ.W #vType,vblQEl1+qType(A0)
- ADDQ.W #vType,vblQEl2+qType(A0)
- MEA1 vbltask1,vblQEl1+vblAddr(A0)
- MEA1 vbltask2,vblQEl2+vblAddr(A0)
- ADDQ.W #1,vblQEl2+vblCount(A0)
-
- _Read ,ASYNC
- MOVE.L A0,A2
- MOVEQ #N-2,D1
- MOVE.L #blksize,D5
- @top
- MOVE.L #readbuff,D0
- LEA 0(A0,D5.L),A1
- _BlockMove
- ADD.L D5,ioBuffer(A1)
- MOVE.L A1,A0
- _Read ,ASYNC
- DBRA D1,@top
- @0 _SystemTask
- SUBQ #2,A7 ;func result:BOOLEAN
- MOVE.W #$FFFF,-(A7) ;eventMASK:INTEGER
- PEA -evtBlkSize(A6) ;VAR theEvent
- _GetNextEvent
- TST.B (A7)+
- BEQ.S @1
- SUBQ.W #keyDwnEvt,(A7) ;evtNum
- BNE.S @1
- CMPI.B #'.',-evtBlkSize+evtMessage+3(A6)
- BNE.S @1
- BTST #cmdKey,-evtBlkSize+evtMeta(A6)
- BEQ.S @1
- @7
- MOVE.L A2,A0
- MOVEQ #N-1,D1
- @8
- MOVE.L zR,ioReqCount(A0)
- MOVE.L zR,sndPB+ioReqCount(A0)
- ADDA.L D5,A0
- DBRA D1,@8
- @1
- TST.W taskcount(A3)
- BNE.S @0
- MOVE.L A2,A0
- _Close
- MOVE.L A3,A0
- _DisposPtr
- BEQ.S @ok
- _Debugger ;should never occur
- @ok UNLK A6
- RTS
- DC.W 'Copyright © 1990 Harvey Grosser'
-
-
- readcomp:
-
- countR EQU D1
- MACRO extR =D2| ;EQU doesn't work properly in MOVEM or index reg.
-
- MOVE.L A3,-(A7)
- MOVE.L ioOwnBuf(A0),A3
- MOVEM.L extlen(A3),extR/A1
- MOVE.L ioActCount(A0),countR
- CMP.L extR,countR
- BGT.S @gtov
-
- SUBQ.W #1,taskcount(A3)
- ; BNE.S @more
- ; MEA1 closed,ioCompletion(A0) ;used by init
- ; _Close ,ASYNC ;we do it synchronously
- ; BRA.S @restore
- ;@more
- LEA readbuff(A0),A0
- MOVE.L countR,D0
- _BlockMove
- MOVE.L D0,extlen(A3) ;better than CLR.L on 68000
- ADDA.L countR,A1
- SUB.L countR,extR
-
- MOVE.L #$80808080,D0
- MOVEQ #3,countR
- AND.W extR,countR
- BRA.S @1
- @0 MOVE.B D0,(A1)+
- @1 DBRA countR,@0
- LSR.W #3,extR
- BCS.S @3
- BRA.S @4
- @2 MOVE.L D0,(A1)+
- @3 MOVE.L D0,(A1)+
- @4 DBRA extR,@2
-
- BRA.S @restore
- @gtov
- ;amount read is greater than previous overrun
- LEA readbuff(A0),A0
- MOVE.L extR,D0
- _BlockMove
- LEA -6(A0,extR),A1
- LEA sndPB-readbuff(A0),A0
- MOVE.L A1,ioBuffer(A0)
- MOVE.W D0,(A1)+ ;D0 = 0 (ffMode) from BlockMove
- MOVE.L rate(A3),(A1)+
- SUB.L extR,countR ;amount left in buffer
- ADDA.L countR,A1 ;point beyond data just read
- MOVE.L #370<<16,extR ;largest possible dividend + 1
- SUB.L countR,extR
- DIVU #370,extR
- CLR.W extR
- SWAP extR
- ADD.L extR,countR
-
- MOVE.L countR,ioReqCount(A0)
- _Write ,ASYNC
-
- MOVEM.L extR/A1,extlen(A3)
- @restore
- MOVE.L (A7)+,A3
- RTS
-
-
- sndcomp:
- BEQ.S @nokill ;test for _KillIO
- CLR.L ioReqCount-sndPB(A0) ;terminate on _KillIO
- @nokill MOVE.B #$80,SoundLevel ;eliminate end click on Mac SE
- TST.B FSBusy
- BNE.S @read
- LEA vblQEl1-sndPB(A0),A0
- ADDQ.W #1,vblCount(A0)
- _VInstall
- RTS
- @read
- LEA -sndPB(A0),A0
- _Read ,ASYNC
- RTS
-
-
- vbltask1:
- TST.B FSBusy
- BNE.S @read
- MOVE.L A0,A2
- SUBQ #2,A7
- _SCSIStat
- TST.W (A7)+
- BEQ.S @scsifree
- ADDQ.W #1,vblCount(A2)
- RTS
- @scsifree
- LEA vblQEl2-vblQEl1(A2),A0
- LEA VBLQueue,A1
- _Enqueue
- RTS
- @read
- LEA -vblQEl1(A0),A0
- _Read ,ASYNC
- RTS
-
-
- vbltask2:
- _VRemove ;-> D0 = 0
- BCLR #inVBL,VBLQueue+qFlags
- CLR.L (A0) ;qLink
- ADDQ.W #1,vblCount(A0)
- LEA -vblQEl2(A0),A0
- _Read ,ASYNC
- RTS
-
- END
-
-